package org.custom.spring.boot.security.token;

import com.fasterxml.jackson.core.JsonProcessingException;
import org.custom.spring.boot.security.entity.SystemUser;
import org.custom.spring.boot.security.entity.SystemUserInfo;
import org.custom.spring.boot.security.exceptions.JwtException;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;

/**
 * Token 令牌管理器
 *
 * @author LiKun
 */
public interface TokenManager extends Serializable {
    /**
     * 根据配置返回存储在数据库中的 Token 的前缀
     *
     * @return Token的前缀
     */
    String getPrefixOfTokenKey();

    /**
     * 生成并返回 TokenKey
     * <p>
     * Key生成规则：允许重复登陆 ? TOKEN_Snowflake_UserId : TOKEN_UserId_Snowflake;
     *
     * @param id 用户ID
     *
     * @return TokenKey 令牌存储的 Key
     */
    String generateTokenKey(String id);

    /**
     * 刷新 Token 令牌数据
     *
     * @param tokenKey KEY值
     * @param path     用户访问路径
     */
    void refreshToken(String tokenKey, String path);

    /**
     * 解析给定 Token 数据并获取数据ID
     *
     * @param token token
     *
     * @return 数据ID
     */
    String parseTokenId(@NotBlank String token) throws JwtException;

    /**
     * 解析给定 Token 数据并获取数据体
     *
     * @param token token
     *
     * @return 数据体
     *
     * @throws JsonProcessingException, JwtException
     */
    SystemUserInfo parseTokenSubject(@NotBlank String token) throws JsonProcessingException;

    /**
     * 根据 systemUser 数据创建并返回 Token 数据
     *
     * @param systemUser 用户数据
     *
     * @return Token数据
     */
    String generateAndTakeEffectToken(@NotNull SystemUser systemUser) throws JsonProcessingException;
}
